這兩天看了一下 Balsn CTF,題目難度果然很高,而且解起來也頗複雜 QQ 因為還得準備下星期的 HITCON CTF,看了幾題覺得會做就精神勝利了 XDD 目前應該剩下 PlainNote 還沒想到做法......null byte 造成的 shrink the chunk 在 glibc 2.29 被修正掉了 T__T 原本以為繞過 tcache 就行了,晚點再回去改一下前幾天的文章 QQ
隨著中國對資安人才的培育,現在中國的強隊真的不少 (A*0*E, r3kapig, Nu1L, Tea Deliverers, ROIS 等等),而且很多人整理和貢獻 CTF 教材,這幾天在復健 (?) 時從 ctf-wiki 和不知道是哪些隊伍的 blog 惡補這陣子脫節的技術,從中受益良多 XD 但還是得提一下中國最早發跡的 CTF 隊伍 -blus-lotus
blue-lotus 最早是由北京清華大學的學生組成,由段海新教授和博士生諸葛建偉共同創辦,隊長由楊坤擔任,後來陸續吸收當時全中國最優秀的 CTF 人才壯大隊伍,並開始向最高殿堂 DEF CON CTF 衝擊,2013 年與其他幾個戰隊聯合成功闖進 DEF CON 21 CTF 決賽,最後獲得第 11 名的成績
2014 和 2015 年也成功進入 DEF CON CTF 決賽,兩年都獲得第五名佳績,2016 年與新生代強隊 0ops
合體組成 b1o0p
,在 CGC 規則之下獲得第二名的成績,之後就比較淡出 CTF 圈,但部分成員還是有組 Tea Deliverers
繼續征戰 DEF CON CTF
blue-lotus 打進 DEF CON CTF 之後,隔年吸收參加 DEF CON CTF 的經驗,自己舉辦 BCTF 百度盃全國網絡安全技術對抗賽,希望能帶起全中國的 CTF 的 CTF 風氣,但當年冠軍是由台灣的 HITCON 217
戰隊拿到,以極大比分的差距獲得勝利 XD
下圖為分數走勢圖,黑色是 HITCON 當時的分數,其他六隊的分數加總還比不過 HITCON 217 的分數,被網友戲稱秦掃六國)
2014 年的百度盃,受眾是中國國內的新生隊伍,志在培養 CTF 的新血,題目從簡單到困難都有,既不會嚇跑剛接觸的群眾,也可以鑑別出強隊的實力,是一場很成功的 CTF
當時 BCTF 除了 CTF 競賽以外,還同時舉辦了百度盃大賽寶貝,CTF 比賽只能說是樸實無華且枯燥,結合選美比賽可以吸引大眾目光,創造話題和商業價值
BCTF 不僅成功帶動了中國 CTF 風氣,也讓 HITCON 戰隊率先體會到 Attack & Defense 規則的下的經驗和訣竅,HITCON 能一舉在 DEF CON 22 CTF 以首次參加就獲得亞軍,參加 BCTF Final 的經驗功不可沒
隔年 BCTF 2015 正式拋開百度盃,正名為 BCTF,向全世界開放註冊,首次證明中國開始有辦世界級 CTF 的能力,最後冠軍由 217 拿下,亞軍為 PPP 和 tomcr00se (geohot),同年 blue-lotus 開始推動 XCTF 聯賽,鼓勵各地的 CTF 隊伍自行舉辦 CTF 比賽並設計聯賽積分的制度,年底選出積分排名前 n 隊的隊伍參加 XCTF 決賽,雖然各大專院校舉辦的 CTF 有些良莠不齊,但整體上來看成功培育出了一批又一批的新興資安人才,此制度在 blue-lotus 和 0ops 的成員都已經陸續畢業投入職場後,還是培育出來 r3kapig, ****** 等強隊支撐中國 CTF 圈
老兵不死,只是凋零....才怪,blue-lotus 雖然逐漸因為工作相對淡出 CTF 圈,但不代表著他們就離開這個圈子,2018 年長亭科技吸收了這幾年工作的經驗,舉辦了第一屆 Real World CTF,號稱所有題目都是由真實世界的漏洞所設計,高額的獎金和宣傳吸引了眾多隊伍來挑戰,至今已經舉辦了兩屆,題目品質也是有目共睹,有空再來介紹 Real World CTF 的經典題目 XD
BCTF 當時全部題目設計背後都有背景故事,以傳奇駭客凱文米特尼克作為故事主軸,搭配自己發想的一些故事情節,真的是別出心裁
當年剛開始接觸 CTF,BCTF 應該是我參加的第二場還第三場賽事,題目由簡單的 100 分到困難的 500 分都有,我好像只解了兩道 100 分的題和一道 200 分的 PPC 題,但對於我來說算是得到了不少信心,當時很多場 CTF 都是一題都解不出來.....ORZ 今天介紹的這題應該是我第一次在正式比賽出解出的 pwn 題,特次紀念 XD
程式是 32 bit 的 x86 程式,沒有 NX 和 stack canary 的保護 (真是美好的年代......),執行起來會印出一段歌詞最後詢問要不要 replay,讓使用者輸入 y
或 n
,在讀取 input 時,因為是透過 scanf("%s", buf)
讀取 input,存在 stack overflow 的問題,執行起來大約長這樣:
(lyrics ...)
Drink all the booze
Hack all the things
Replay?(y/n)
這題程式有故意留後門,讀取完 input 之後,會把 input 逐 byte 和 <baidu-rocks,froM-china-with-love>
這個字串做 xor 運算,然後檢查前 10 byte 是不是等於 n0b4CKd00r
,如果相同就會跳 buf+10
的位置執行,因此我當時的做法是:
payload = xor("n0b4CKd00r" + shellcode, "<baidu-rocks,froM-china-with-love>")
\x00
, \x0a
, \x20
之類的會讓 scanf 終止的字串,如果有出現非法字元,用 \x90
nop 調整 shellcode 的順序後來比賽結束,我看 217 分享的 write up,才知道這題完全不需要這個後門程序 = = 利用簡單的 ROP 就可以秒殺這題,誰還跟你算 xor 調 offset ...... XD 這題也是我第一次見識到 unintented solution 的威能,感恩 217,讚嘆 217 (?)